/**
 * 通用工具 Hook
 * 提供页面实例、配置等常用功能
 *
 * @example
 * ```typescript
 * import { useCommon } from '@/hooks/useCommon'
 *
 * const {
 *   varCss,
 *   cdn,
 *   globalColor,
 *   navHeight,
 *   getOptions,
 *   beforeVm,
 *   getVm
 * } = useCommon()
 *
 * // 获取当前页面参数
 * const options = getOptions()
 *
 * // 获取上一页实例
 * const prevPage = beforeVm()
 * ```
 */

import { computed } from "vue";
import varCss from "@/css/var.module.scss";
import config from "@/config";

interface CommonReturn {
    /** CSS 变量 */
    varCss: typeof varCss;
    /** CDN 地址 */
    cdn: string;
    /** 全局主题色 */
    globalColor: string;
    /** 导航栏高度 */
    navHeight: any;
    /** 获取当前页面参数 */
    getOptions: () => Record<string, any>;
    /** 获取上一页实例 */
    beforeVm: (page?: number) => any;
    /** 获取当前页面实例 */
    getVm: () => any;
}

export default function useCommon(): CommonReturn {
    /**
     * 导航栏高度（响应式）
     */
    const navHeight = computed(() => {
        return uni.getStorageSync("navHeight") || 0;
    });

    /**
     * 获取当前页面的 options 参数
     * @returns 当前页面的路由参数对象
     */
    const getOptions = (): Record<string, any> => {
        try {
            const pages = getCurrentPages();
            if (pages.length === 0) {
                console.warn("[useCommon] 当前没有页面栈");
                return {};
            }

            const vm: any = pages[pages.length - 1];
            return vm?.options || {};
        } catch (error) {
            console.error("[useCommon] 获取页面参数失败:", error);
            return {};
        }
    };

    /**
     * 获取上一页的页面实例
     * @param page 往前数第几页，默认为 1（上一页）
     * @returns 页面实例或 null
     */
    const beforeVm = (page: number = 1): any => {
        try {
            const pages = getCurrentPages();
            const targetIndex = pages.length - (page + 1);

            if (targetIndex < 0) {
                console.warn(`[useCommon] 无法获取往前第 ${page} 页，页面栈不足`);
                return null;
            }

            const targetPage: any = pages[targetIndex];
            return targetPage?.$vm || null;
        } catch (error) {
            console.error("[useCommon] 获取上一页实例失败:", error);
            return null;
        }
    };

    /**
     * 获取当前页面实例
     * @returns 当前页面实例或 null
     */
    const getVm = (): any => {
        try {
            const pages = getCurrentPages();
            if (pages.length === 0) {
                console.warn("[useCommon] 当前没有页面栈");
                return null;
            }

            const currentPage: any = pages[pages.length - 1];
            return currentPage?.$vm || null;
        } catch (error) {
            console.error("[useCommon] 获取当前页面实例失败:", error);
            return null;
        }
    };

    return {
        // 配置数据
        varCss,
        cdn: config.cdn,
        globalColor: varCss.color,

        // 响应式数据
        navHeight,

        // 方法
        getOptions,
        beforeVm,
        getVm
    };
}
